package com.linkgie.galaxyframework.security.ca;

import com.linkgie.galaxyframework.crypto.PublicKey;

/**
 * 证书颁发机构接口；
 */
public interface CertificateAuthority {

    /**
     * CA 主体；
     * 
     * @return
     */
    String getPrincipal();

    /**
     * CA 的证书；
     * 
     * @return
     */
    Certificate getCertificate();

    /**
     * CA 的公钥；
     * 
     * @return
     */
    PublicKey getPublicKey();

    /**
     * 返回最大传播距离；
     * 
     * @return
     */
    int getMaxPropagationDistance();

    /**
     * 签发证书；
     * 
     * <p>
     * 注：如果当前 CA 证书的传播距离为 0 ，调用此方法时会引发异常 {@link CertificateException } 阻止签发下级证书；
     * 
     * @param principal 主体；
     * @param publicKey 主体的公钥；
     * @param subject   证书主题；
     * @return
     */
    default Certificate sign(String principal, PublicKey publicKey, long lifeTime, String subject) {
        return sign(principal, publicKey, getCertificate().getPropagationDistance() - 1, lifeTime, subject);
    }

    /**
     * 签发证书；
     * <p>
     * 注：如果当前 CA 证书的传播距离为 0 ，调用此方法时会引发异常 {@link CertificateException } 阻止签发下级证书；
     * 
     * @param principal         主体；
     * @param publicKey         主体的公钥；
     * @param progationDistance 传播距离；有效值必须大于等于 0 ， 且小于当前 CA 证书传播距离；
     * @param subject           证书主题；
     * @return
     */
    Certificate sign(String principal, PublicKey publicKey, int progationDistance, long lifeTime, String subject);

}
